// Scintilla source code edit control
/** @file CharacterCategory.h
 ** Returns the Unicode general category of a character.
 **/
// Copyright 2013 by Neil Hodgson <neilh@scintilla.org>
// The License.txt file describes the conditions under which this software may be distributed.

#ifndef CHARACTERCATEGORY_H
#define CHARACTERCATEGORY_H

namespace Scintilla {

enum CharacterCategory {
  ccLu,
  ccLl,
  ccLt,
  ccLm,
  ccLo,
  ccMn,
  ccMc,
  ccMe,
  ccNd,
  ccNl,
  ccNo,
  ccPc,
  ccPd,
  ccPs,
  ccPe,
  ccPi,
  ccPf,
  ccPo,
  ccSm,
  ccSc,
  ccSk,
  ccSo,
  ccZs,
  ccZl,
  ccZp,
  ccCc,
  ccCf,
  ccCs,
  ccCo,
  ccCn
};

CharacterCategory CategoriseCharacter(int character);

// Common definitions of allowable characters in identifiers from UAX #31.
bool IsIdStart(int character);
bool IsIdContinue(int character);
bool IsXidStart(int character);
bool IsXidContinue(int character);

class CharacterCategoryMap {
 private:
  std::vector<unsigned char> dense;

 public:
  CharacterCategoryMap() noexcept;
  CharacterCategory CategoryFor(int character) const {
    if (static_cast<size_t>(character) < dense.size()) {
      return static_cast<CharacterCategory>(dense[character]);
    } else {
      // binary search through ranges
      return CategoriseCharacter(character);
    }
  }
  int Size() const noexcept;
  void Optimize(int countCharacters);
};

}  // namespace Scintilla

#endif
